package gerenciaDados.cln.cdp;

import gerenciaDados.cln.cgt.PI.DB;
import gerenciaDados.exceptions.SenhaOuUsuarioNaoConfereException;
import gerenciaDados.exceptions.UsuarioJaCadastradoException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class UsuarioLogado {

	Integer cd_usuario;
	String nomeCompleto;
	String nomeUsuario;
	ClasseUsuario classeUsuario;
	String senha;
	
	public enum ClasseUsuario {
		ADMINISTRADOR,
		OPERADOR;
	}

	private UsuarioLogado(Integer cd_usuario, String nomeCompleto, String nomeUsuario,
			ClasseUsuario classeUsuario, String senha) {
		super();
		this.cd_usuario = cd_usuario;
		this.nomeCompleto = nomeCompleto;
		this.nomeUsuario = nomeUsuario;
		this.classeUsuario = classeUsuario;
		this.senha = senha;
	}

	public static UsuarioLogado efetuarLogin(String nomeUsuario, String senha) throws SenhaOuUsuarioNaoConfereException {
		Connection con = DB.conecta();
		try {
			Statement stt = con.createStatement();		
			ResultSet rs = stt.executeQuery("select cd_usuario, nomecompleto, classe from usuario where nomeusuario='" +nomeUsuario+
											"' AND senha='" +senha+ "';");
			
			while(rs.next()) {
				ClasseUsuario classeUsuario = null;
				if(rs.getString("classe").equals("ADM")) classeUsuario = ClasseUsuario.ADMINISTRADOR;
				else classeUsuario = ClasseUsuario.OPERADOR;
				
				return new UsuarioLogado(rs.getInt("cd_usuario"), nomeUsuario, rs.getString("nomecompleto"), classeUsuario, senha);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		throw new SenhaOuUsuarioNaoConfereException();
	}

	public String getNomeCompleto() {
		return nomeCompleto;
	}

	public ClasseUsuario getClasse() {
		return classeUsuario;
	}
	
	public String getSenha() {
		return senha;
	}

	public static ArrayList<String[]> getAllUsuarios() {
		Connection con = DB.conecta();
		ArrayList<String[]> lstUsuarios = new ArrayList<String[]>();
		
		try {
			Statement stt = con.createStatement();
			ResultSet rs = stt.executeQuery("select nomeusuario, nomecompleto, classe, senha from usuario where ativo=true");
			
			while(rs.next()) {
				String[] lstParam = new String[4];
				
				lstParam[0] = rs.getString("nomeusuario").trim();
				lstParam[1] = rs.getString("nomecompleto").trim();
				lstParam[2] = rs.getString("classe");  //"ADM";
				lstParam[3] = rs.getString("senha").trim();
				lstUsuarios.add(lstParam);
			}
			
			stt.close();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lstUsuarios;
	}
	
	public static void incluirNovoUsuario(String nomeCompleto,
			String nomeUsuario, String senha, String classeUsuario) throws UsuarioJaCadastradoException {
		
		Connection con;
		if(verificarUsuarioCadastrado(nomeUsuario) == true) throw new UsuarioJaCadastradoException();
		
		con = DB.conecta();
		try {
			PreparedStatement ps = con.prepareStatement("insert into usuario (nomeusuario, nomecompleto, classe, senha) values" +
					" ('" +nomeUsuario+ "','" +nomeCompleto+ "','" +classeUsuario+ "','" +senha+ "')");
			
			con.setAutoCommit(false);
			ps.executeUpdate();
			con.commit();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private static boolean verificarUsuarioCadastrado(String nomeUsuario) {
		Connection con = DB.conecta();
		boolean usuarioCadastrado = false;
		
		try {
			Statement stt = con.createStatement();
			System.out.println(nomeUsuario);
			ResultSet rs = stt.executeQuery("select nomecompleto from usuario where nomeusuario='" +nomeUsuario+ "';");
			
			if(rs.next()) usuarioCadastrado = true;
			
			stt.close();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return usuarioCadastrado;
	}

	public static void alterarDadosUsuario(String nomeCompleto,
			String nomeUsuario, String senha, String classeUsuario) {
		Connection con = DB.conecta();
		try {
			PreparedStatement ps = con.prepareStatement("update usuario set nomecompleto=?, classe='" +classeUsuario+ "', senha=? where nomeusuario=?");
			
			ps.setString(1, nomeCompleto);
			ps.setString(2, senha);
			ps.setString(3, nomeUsuario);
			
			con.setAutoCommit(false);					
			ps.executeUpdate();
			con.commit();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void excluirUsuario(String nomeUsuario) {
		Connection con = DB.conecta();
		String query = "";
		if(/*verificarUsuarioEfetuouAtividade(nomeUsuario) == true*/false) {
			query = "update usuario set ativo=false where nomeusuario=?";
		} else {
			query = "delete from usuario where nomeusuario=?";
		}
		try {
			PreparedStatement ps = con.prepareStatement(query);
			
			ps.setString(1, nomeUsuario);
			
			con.setAutoCommit(false);					
			ps.executeUpdate();
			con.commit();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static boolean verificarUsuarioEfetuouAtividade(String nomeUsuario) {
		Connection con = DB.conecta();
		int cd_usuario = 0;
		ResultSet rs, rsImportacao, rsTreinamento, rsClassificacao, rsAtualizacao;
		boolean efetuouAtividade = false;
		
		try {
			Statement stt = con.createStatement();
			rs = stt.executeQuery("select cd_usuario from usuario where nomeusuario='" +nomeUsuario+ "';");
			while(rs.next()) {
				cd_usuario = rs.getInt("cd_usuario");
				System.out.println(cd_usuario);
			}
			
			rsImportacao = stt.executeQuery("select count(*) from importacao where cd_usuario=" +cd_usuario);
			rsTreinamento = stt.executeQuery("select count(*) from treinamento where cd_usuario=" +cd_usuario);
			rsClassificacao = stt.executeQuery("select count(*) from classificacao where cd_usuario=" +cd_usuario);
			rsAtualizacao = stt.executeQuery("select count(*) from atualizacao where cd_usuario=" +cd_usuario);
			
			if(rsImportacao.next()) efetuouAtividade = true;
			if(rsTreinamento.next()) efetuouAtividade = true;
			if(rsClassificacao.next()) efetuouAtividade = true;
			if(rsAtualizacao.next()) efetuouAtividade = true;
			
			stt.close();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return efetuouAtividade;
	}

	public static UsuarioLogado getUsuario(String nomeUsuario) {
		Connection con = DB.conecta();
		String nomeCompleto = null, senha = null, classeUsuario = null;
		ClasseUsuario classe;
		Integer cd_usuario = null;
		System.out.println(nomeUsuario);
		
		try {
			Statement stt = con.createStatement();
			ResultSet rs = stt.executeQuery("select cd_usuario, nomecompleto, classe, senha from usuario where nomeusuario='" +nomeUsuario+ "';");
			
			while(rs.next()) {
				
				cd_usuario = rs.getInt("cd_usuario");
				nomeCompleto = rs.getString("nomecompleto").trim();
				classeUsuario = rs.getString("classe");
				senha = rs.getString("senha").trim();
			}
			
			stt.close();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println(classeUsuario);
		if(classeUsuario.equals("ADM")) classe = ClasseUsuario.ADMINISTRADOR;
		else classe = ClasseUsuario.OPERADOR;
		
		return new UsuarioLogado(cd_usuario, nomeCompleto, nomeUsuario, classe, senha);
	}

	public int getCd_usuario() {
		return cd_usuario;
	}
}
